package Model;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import javax.persistence.*;
import org.hibernate.annotations.FetchMode;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.Fetch;

@Entity
@Table(name = "itempedidoempresa", uniqueConstraints = @UniqueConstraint(columnNames = {"cod_pedido_empresa", "cod_produto"}))
public class ItemPedidoEmpresa implements Serializable {

    @Id
    @SequenceGenerator(name = "cod_item_pedido_empresa", sequenceName = "cod_item_pedido_empresa_seq", allocationSize = 1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "cod_item_pedido_empresa")
    @Column(name = "cod_item_pedido_empresa", nullable = false)
    private int codItemPedidoEmpresa;

    //é preciso que o código de empresa seja indicado para o pedido em questão
    @ManyToOne(fetch = FetchType.EAGER, cascade = {CascadeType.MERGE, CascadeType.PERSIST})
    @JoinColumn(name = "cod_pedido_empresa", insertable = true, updatable = true)
    @Cascade(org.hibernate.annotations.CascadeType.LOCK)
    private PedidoEmpresaVO pedidoEmpresa;
    
    @OneToMany(fetch = FetchType.EAGER, mappedBy = "itemPedidoEmpresa", cascade = {CascadeType.MERGE, CascadeType.REMOVE})
    @Fetch(FetchMode.SELECT)
    @Cascade(org.hibernate.annotations.CascadeType.LOCK)
    private Collection<ItemPedidoAssociado> ItemPedidoAssociado;

    @ManyToOne(fetch = FetchType.EAGER)
    @Cascade(org.hibernate.annotations.CascadeType.LOCK)
    @JoinColumn(name = "cod_produto", insertable = true)
    private Produto produto;

    @Column(name = "quantidade", insertable = true)
    private double quantidade;

    @Column(name = "preco_unitario", insertable = true)
    private double valorUnitario;

    @Column(name = "quantidade_auxiliar", insertable = true)
    private double quantidadeAuxiliar;

    @Column(name = "valor_total", insertable = true)
    private double valorTotal;
    
    @Column(name = "peso_caixa", insertable = true)
    private double pesoCaixa;

    //Construtores
    //Construtor Padrao
    public ItemPedidoEmpresa() {
        quantidade = 0;
        valorUnitario = 0.00;
        produto = new Produto();
        pedidoEmpresa = new PedidoEmpresaVO();
        ItemPedidoAssociado = new ArrayList<ItemPedidoAssociado>();
    }
    //Constutor com parametros

    public ItemPedidoEmpresa(double quantidade, double valorUnitario, double quantidadeAuxiliar, double valorTotal, double pesoCaixa) {
        this.quantidade = quantidade;
        this.valorUnitario = valorUnitario;
        this.quantidadeAuxiliar = quantidadeAuxiliar;
        this.valorTotal = valorTotal;
        this.pesoCaixa = pesoCaixa;
    }

    public double getPesoCaixa() {
        return pesoCaixa;
    }

    public void setPesoCaixa(double pesoCaixa) {
        this.pesoCaixa = pesoCaixa;
    }

    //Metodos Get e Set
    public double getQuantidadeAuxiliar() {
        return quantidadeAuxiliar;
    }

    public void setQuantidadeAuxiliar(double quantidadeAuxiliar) {
        this.quantidadeAuxiliar = quantidadeAuxiliar;
    }

    public double getValorTotal() {
       valorTotal = quantidade*valorUnitario;
        return valorTotal;
    }

    public void setValorTotal(double valorTotal) {
        this.valorTotal = valorTotal;
    }

    public double getQuantidade() {
        return quantidade;
    }

    public void setQuantidade(double quantidade) {
        this.quantidade = quantidade;
    }

    public double getValorUnitario() {
        return valorUnitario;
    }

    public void setValorUnitario(double valorUnitario) {
        this.valorUnitario = valorUnitario;
    }

    public PedidoEmpresaVO getPedidoEmpresa() {
        return pedidoEmpresa;
    }

    public void setPedidoEmpresa(PedidoEmpresaVO pedidoEmpresa) {
        this.pedidoEmpresa = pedidoEmpresa;
    }

    public Produto getProduto() {
        return produto;
    }

    public void setProduto(Produto produto) {
        this.produto = produto;
    }

    public int getCodItemPedidoEmpresa() {
        return codItemPedidoEmpresa;
    }

    public void setCodItemPedidoEmpresa(int codItemPedidoEmpresa) {
        this.codItemPedidoEmpresa = codItemPedidoEmpresa;
    }

    public Collection<ItemPedidoAssociado> getItemPedidoAssociado() {
        return ItemPedidoAssociado;
    }

    public void setItemPedidoAssociado(Collection<ItemPedidoAssociado> ItemPedidoAssociado) {
        this.ItemPedidoAssociado = ItemPedidoAssociado;
    }
        public void adicionarItemAssociado(ItemPedidoAssociado item) {
        boolean contem = false;

        if (ItemPedidoAssociado.isEmpty()) {
            ItemPedidoAssociado.add(item);
        } else {
            List<ItemPedidoAssociado> itemAss = (List<ItemPedidoAssociado>) ItemPedidoAssociado;
            for (int i = 0; i < itemAss.size(); i++) {
                //codPrevisao equivale ao codAssociado
                if (itemAss.get(i).getItemPrevisao().getCodItemPrevisao() == item.getItemPrevisao().getCodItemPrevisao()) {
                    item.setQuantidade(itemAss.get(i).getQuantidade() + item.getQuantidade());
                    item.setCodItemPedidoAssociado(itemAss.get(i).getCodItemPedidoAssociado());
                    itemAss.remove(i);
                    itemAss.add(i, item);
                    contem = true;
                    i = itemAss.size();
                }
            }
            if (!contem) {
                itemAss.add(item);
            }
            setItemPedidoAssociado(itemAss);
        }
    }

    public void adicionarItemAssociadoVenda(ItemPedidoAssociado item) {
        boolean contem = false;

        if (ItemPedidoAssociado.isEmpty()) {
            ItemPedidoAssociado.add(item);
            } else {
            List<ItemPedidoAssociado> itemAss = (List<ItemPedidoAssociado>) ItemPedidoAssociado;
            for (int i = 0; i < itemAss.size(); i++) {
                //codPrevisao equivale ao codAssociado
                if (itemAss.get(i).getItemPrevisao().getCodItemPrevisao() == item.getItemPrevisao().getCodItemPrevisao()) {

                    item.setCodItemPedidoAssociado(itemAss.get(i).getCodItemPedidoAssociado());
                    itemAss.remove(i);
                    itemAss.add(i, item);
                    contem = true;
                    i = itemAss.size();
                }
            }
            if (!contem) {
                itemAss.add(item);
            }
            setItemPedidoAssociado(itemAss);
        }
    }
}
